在上一篇我們學到用actions/toolkit的core撰寫JS action
這篇我們會來會來看一下如何在workflow中執行js檔
在workflow中執行js檔和製作一個JS action並在workflow中使用它的概念有點像,它們都是以JS去撰寫,並複用那些邏輯,不過這並不是一個正規的方法,而是一種workfaround
通常如果有以下需求的話可以考慮採這個方式
1.若本地執行、Github Actions上執行都會發生的話,就建議採在workflow中執行js檔
因為我們可以透過command傳參數給js檔,但是JS action一定只能透過input context接收參數,故無法在本地成功執行
2.未來考慮搬家到其他平台
例如Jenkins並沒不支援JS action的功能,但是可以仍可以執行js檔
不過這個方法也有一些缺點
npm install minimist
minimist 是一個Node package,用來解析command中帶的參數,並將參數轉換為 JavaScript 物件,讓處理傳入的參數更方便
在.github目錄以外的地方建個資料夾裝工具類的js檔
import minimist from 'minimist';
function main(){
  const argv = minimist(process.argv.slice(2));
  const userName = argv.name;
  // 在這個js檔中所有印出的東西都會被視為return value,所以要慎選印出的內容
  console.log(`Hello ${userName}. How's it going with your new workflow?`);
  console.log('It\'s good. I\'m trying to run JS file in it.');
  // 反而return value不會被當作return value
  return `Hello ${userName}. This is my return value`;
}
main();
另外你可能也會看到有人用console.log印出set-output這個Github Actions提供的command
console.log('::set-output name=userName::Tempura');
這也是一種workaround,但set-output已被公告未來會廢棄,所以不建議這麼做
看到這你可能會好奇那console.log("userName=Tempura >> $GITHUB_OUTPUT")有沒有用,答案是沒有用
因為當workflow在執行時,runner會產生暫時的檔案,環境變數、output就會被放在這些檔案中,所以無法用這種方式無法寫入這個暫存檔
jobs:
  run_js_file:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: |
          npm install
          npm list
      - name: step1
        id: say-hello
        run: |
          echo reply=$(node tools/index.js --name Tempura) >> $GITHUB_ENV
      - name: step2
        run: | 
          echo reply is $reply
